/*
 * 
 *  This file is part of Sourceprojects.org Lycia Copyright 2010 noctarius
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 * 
 */
package org.sourceprojects.lycia.internal.resolver;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;

import org.osgi.framework.Bundle;
import org.sourceprojects.lycia.NamespaceResolver;
import org.sourceprojects.lycia.internal.dom.ResourceResolverResult;
import org.sourceprojects.lycia.internal.dom.ResourceResolverResultImpl;
import org.sourceprojects.lycia.internal.resolver.BasicNamespaceResolver.NamespaceResolverHandlerContainer;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSInput;

/**
 * 
 * @author noctarius
 * @since 0.0.5
 */
public class OsgiBasicNamespaceResolver implements NamespaceResolver {
	private final NamespaceResolverHandlerContainer[] containers;
	private final Bundle bundle;

	public OsgiBasicNamespaceResolver(
			final NamespaceResolverHandlerContainer[] containers,
			final Bundle bundle) {
		this.containers = new NamespaceResolverHandlerContainer[containers.length];
		System.arraycopy(containers, 0, this.containers, 0, containers.length);
		this.bundle = bundle;
	}

	@Override
	public ResourceResolverResult getInput(final String type,
			final String namespaceURI, final String publicId,
			final String systemId, final String baseURI) {

		for (final NamespaceResolverHandlerContainer container : containers) {
			if (container.getNamespaceURI().equals(namespaceURI)
					|| container.getNamespaceURI().equals(systemId)) {
				final InputStream is = getByteStream(container
						.getRedirectedURI());

				final ResourceResolverResultImpl input = new ResourceResolverResultImpl();
				input.setBaseURI(baseURI);
				input.setPublicId(publicId);
				input.setSystemId(systemId);
				input.setByteStream(is);

				return input;
			}
		}

		try {
			final DOMImplementationRegistry registry = DOMImplementationRegistry
					.newInstance();
			final DOMImplementationLS domImpl = (DOMImplementationLS) registry
					.getDOMImplementation("XML").getFeature("LS", "");

			final LSInput input = domImpl.createLSInput();

			final ResourceResolverResult impl = new ResourceResolverResultImpl();
			impl.setBaseURI(input.getBaseURI());
			impl.setByteStream(input.getByteStream());
			impl.setCertifiedText(input.getCertifiedText());
			impl.setCharacterStream(input.getCharacterStream());
			impl.setEncoding(input.getEncoding());
			impl.setPublicId(input.getPublicId());
			impl.setStringData(input.getStringData());

			return impl;

		} catch (final ClassCastException e) {
			return new ResourceResolverResultImpl();
		} catch (final ClassNotFoundException e) {
			return new ResourceResolverResultImpl();
		} catch (final InstantiationException e) {
			return new ResourceResolverResultImpl();
		} catch (final IllegalAccessException e) {
			return new ResourceResolverResultImpl();
		}
	}

	@Override
	public String getNamespaceURI() {
		return null;
	}

	private InputStream getByteStream(final String uri) {
		final URL url = bundle.getResource(uri);
		try {
			return url.openStream();
		} catch (final IOException e) {
			return null;
		}
	}

	@Override
	public String toString() {
		return "OsgiBasicNamespaceResolver [bundle=" + bundle + ", containers="
				+ Arrays.toString(containers) + "]";
	}

}
